package cn.zk.solution.client;

import cn.zk.solution.protocol.MessageProtocol;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class TcpClientHandler extends SimpleChannelInboundHandler<MessageProtocol> {
    private int count;
    /**
     * 读取数据
     * @param ctx
     * @param message :自定义协议包
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MessageProtocol message) throws Exception {
        // 接收数据
        int len = message.getLen();
        byte[] content = message.getContent();
        System.out.println("---------开始---------");
        System.out.println("客服端收到信息如下:");
        System.out.println("长度:"+len);
        System.out.println("内容:"+new String(content,StandardCharsets.UTF_8));
        System.out.println("消息包数据量:"+(++this.count));
        System.out.println("---------完毕---------");
        System.out.println();
        System.out.println();
        System.out.println();
    }

    /**
     * 通道活跃
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 连续10发送,会发现客户端并不是接收10次,而是少于10次，出现TCP沾包、拆包问题。
//        for (int i=0;i<10;i++) {
//            String message = "hello,server"+i;
//            byte[] content = message.getBytes(StandardCharsets.UTF_8);
//            // 创建协议包对象
//            MessageProtocol protocol = new MessageProtocol();
//            protocol.setLen(content.length);
//            protocol.setContent(content);
//            // 发送协议包
//            ctx.writeAndFlush(protocol);
//        }
        while (true) {
            String message = "hello,server "+System.currentTimeMillis();
            byte[] content = message.getBytes(StandardCharsets.UTF_8);
            // 创建协议包对象
            MessageProtocol protocol = new MessageProtocol();
            protocol.setLen(content.length);
            protocol.setContent(content);
            // 发送协议包
            ctx.writeAndFlush(protocol);
            Thread.sleep(500);// 休眠0.5s
        }
    }

    /**
     * 通道不活跃
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
    }

    /**
     * 捕获的异常
     *
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        // 关闭通道
        ctx.close();
    }

}
